/*
 * 数据库管理工具配置
 *
 * @Author:    1024创新实验室-主任：卓大
 * @Date:      2024-01-01 00:00:00
 * @Wechat:    zhuda1024
 * @Email:     lab1024@163.com
 * @Copyright  1024创新实验室 （ https://1024lab.net ），Since 2012
 */

// 查询性能配置
export const QUERY_CONFIG = {
  // 默认分页大小
  DEFAULT_PAGE_SIZE: 50,
  
  // 分页大小选项
  PAGE_SIZE_OPTIONS: [10, 20, 50, 100, 200, 500],
  
  // 最大返回行数
  MAX_ROWS: 10000,
  
  // 最小返回行数
  MIN_ROWS: 100,
  
  // 默认超时时间（秒）
  DEFAULT_TIMEOUT: 30,
  
  // 最小超时时间（秒）
  MIN_TIMEOUT: 5,
  
  // 最大超时时间（秒）
  MAX_TIMEOUT: 300,
  
  // 表格最大高度（像素）
  TABLE_MAX_HEIGHT: 400,
  
  // 字符串最大显示长度
  MAX_STRING_LENGTH: 100,
  
  // 列最大宽度（像素）
  MAX_COLUMN_WIDTH: 300,
  
  // 默认列宽度（像素）
  DEFAULT_COLUMN_WIDTH: 150,
};

// 危险SQL关键词
export const DANGEROUS_SQL_KEYWORDS = [
  'DROP',
  'DELETE',
  'TRUNCATE',
  'ALTER',
  'CREATE',
  'INSERT',
  'UPDATE',
];

// 需要确认的SQL关键词
export const CONFIRM_SQL_KEYWORDS = [
  'DROP',
  'DELETE',
  'TRUNCATE',
  'ALTER',
];

// 查询历史配置
export const HISTORY_CONFIG = {
  // 最大历史记录数
  MAX_HISTORY_COUNT: 50,
  
  // 历史记录存储键
  STORAGE_KEY: 'database_manager_history',
};

// 导出配置
export const EXPORT_CONFIG = {
  // 最大导出行数
  MAX_EXPORT_ROWS: 10000,
  
  // 支持的导出格式
  SUPPORTED_FORMATS: ['csv', 'excel'],
  
  // 默认导出格式
  DEFAULT_FORMAT: 'csv',
};

// 性能监控配置
export const PERFORMANCE_CONFIG = {
  // 慢查询阈值（毫秒）
  SLOW_QUERY_THRESHOLD: 5000,
  
  // 内存使用警告阈值（MB）
  MEMORY_WARNING_THRESHOLD: 100,
  
  // 是否启用性能监控
  ENABLE_PERFORMANCE_MONITORING: true,
};

// 安全配置
export const SECURITY_CONFIG = {
  // 是否启用SQL注入检测
  ENABLE_SQL_INJECTION_DETECTION: true,
  
  // 是否启用危险操作确认
  ENABLE_DANGEROUS_OPERATION_CONFIRMATION: true,
  
  // 是否限制查询范围
  ENABLE_QUERY_SCOPE_LIMITATION: true,
  
  // 禁止的SQL模式
  FORBIDDEN_SQL_PATTERNS: [
    /DROP\s+DATABASE/i,
    /DROP\s+TABLE\s+.*\s+CASCADE/i,
    /TRUNCATE\s+TABLE\s+.*\s+CASCADE/i,
  ],
};

// 默认查询模板
export const QUERY_TEMPLATES = {
  // 查看表结构
  SHOW_TABLE_STRUCTURE: (tableName) => `DESCRIBE ${tableName}`,
  
  // 查看表数据（限制行数）
  SHOW_TABLE_DATA: (tableName, limit = 50) => `SELECT * FROM ${tableName} LIMIT ${limit}`,
  
  // 查看表记录数
  SHOW_TABLE_COUNT: (tableName) => `SELECT COUNT(*) as total FROM ${tableName}`,
  
  // 查看表索引
  SHOW_TABLE_INDEXES: (tableName) => `SHOW INDEX FROM ${tableName}`,
  
  // 查看表创建语句
  SHOW_CREATE_TABLE: (tableName) => `SHOW CREATE TABLE ${tableName}`,
};

// 错误消息配置
export const ERROR_MESSAGES = {
  // 查询超时
  QUERY_TIMEOUT: '查询超时，请尝试添加WHERE条件或减少查询范围',
  
  // 数据量过大
  DATA_TOO_LARGE: '查询结果数据量过大，请添加WHERE条件或LIMIT子句',
  
  // 内存不足
  INSUFFICIENT_MEMORY: '内存不足，请减少查询范围或分页查询',
  
  // 危险操作
  DANGEROUS_OPERATION: '检测到危险操作，请确认后继续',
  
  // 权限不足
  INSUFFICIENT_PERMISSIONS: '权限不足，无法执行此操作',
  
  // 连接失败
  CONNECTION_FAILED: '数据库连接失败，请检查数据源配置',
  
  // SQL语法错误
  SQL_SYNTAX_ERROR: 'SQL语法错误，请检查语句格式',
};

// 工具函数
export const UTILS = {
  // 格式化执行时间
  formatExecutionTime: (time) => {
    if (time < 1000) {
      return `${time}ms`;
    } else if (time < 60000) {
      return `${(time / 1000).toFixed(2)}s`;
    } else {
      return `${(time / 60000).toFixed(2)}min`;
    }
  },
  
  // 格式化数据大小
  formatDataSize: (bytes) => {
    if (bytes < 1024) {
      return `${bytes}B`;
    } else if (bytes < 1024 * 1024) {
      return `${(bytes / 1024).toFixed(2)}KB`;
    } else if (bytes < 1024 * 1024 * 1024) {
      return `${(bytes / (1024 * 1024)).toFixed(2)}MB`;
    } else {
      return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)}GB`;
    }
  },
  
  // 检查是否为危险SQL
  isDangerousSQL: (sql) => {
    const upperSql = sql.toUpperCase();
    return DANGEROUS_SQL_KEYWORDS.some(keyword => upperSql.includes(keyword));
  },
  
  // 检查是否需要确认
  needsConfirmation: (sql) => {
    const upperSql = sql.toUpperCase();
    return CONFIRM_SQL_KEYWORDS.some(keyword => upperSql.includes(keyword));
  },
  
  // 生成安全的查询语句
  generateSafeQuery: (tableName, limit = QUERY_CONFIG.DEFAULT_PAGE_SIZE) => {
    return `SELECT * FROM ${tableName} LIMIT ${limit}`;
  },
  
  // 截断长字符串
  truncateString: (str, maxLength = QUERY_CONFIG.MAX_STRING_LENGTH) => {
    if (typeof str !== 'string') return str;
    return str.length > maxLength ? str.substring(0, maxLength) + '...' : str;
  },
}; 